/*
 * IndependienteJFC.java
 *
 * Created on 5 de abril de 2007, 10:59 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
/*      Este programa es software libre; usted puede redistribuirlo y/o
	modificarlo bajo los t�rminos de la Licencia Publica General Menor
	GNU como se publica por la Fundaci�n de Software Libre; Ya sea la
	versi�n 2 de la licencia, o cualquier versi�n posterior.

	Este programa es distribuido con la esperanza de que ser� �til, pero
	SIN NINGUNA GARANTIA; a�n sin la garant�a impl�cita de
	COMERCIALIZACI�N o AJUSTES PARA UN PROP�SITO PARTICULAR. Dir�jase a
	la Licencia P�blica General Menor GNU para mas detalles.

	Usted debe haber recibido una copia de la Licencia Publica General
	Menor GNU junto con este programa; de lo contrario, escriba a la
	Fundaci�n de Software Libre (Free Software Fundation, Inc.),
	59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
	
*/

package futbol.tacticas.concursantes2007.independientejfc;

import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
import futbol.General;
/**
 *
 * @author juan macini
 */
public class IndependienteJFC implements Tactica{
    
    /** Creates a new instance of IndependienteJFC */
    public IndependienteJFC() {
    }
   //4-2-1-3 
    private int nValores[][]={
        {-148,0,6},  // Jugador 1[0]
        {-100,-65,5},  // Jugador 2[1]
        {-100,-20,7},  // Jugador 3[2]
        {-100,20,7},  // Jugador 4[3]
        {-100,65,5},  // Jugador 5[4]
        {-45,-30,5},  // Jugador 6[5]
        {-45,30,5},  // Jugador 7[6]
        {30,0,4},  // Jugador 8[7]
        {80,-60,5},  // Jugador 9[8]
        {90,0,8},  // Jugador 10[9]
        {80,60,5}  // Jugador 11[10]
    };
    
   //5-1-1-3 
    /*private int nValores[][]={
        {-148,0,7},  // Jugador 1[0]
        {-75,-90,5},  // Jugador 2[1]
        {-100,-49,6},  // Jugador 3[2]
        {-100,0,6},  // Jugador 4[3]
        {-100,49,6},  // Jugador 5[4]
        {-75,90,4},  // Jugador 6[5]
        {-35,0,4},  // Jugador 7[6]
        {35,0,4},  // Jugador 8[7]
        {95,-70,6},  // Jugador 9[8]
        {95,0,5},  // Jugador 10[9]
        {95,70,6}  // Jugador 11[10]
    };*/
    
    public Color getColor1() {
        return Color.RED;
    }

    public Color getColor2() {
        return new Color(255,255,255);
    }

    public Color getColorNumero() {
        return Color.black;
    }

    public String getNombre() {
        return "Johan F.C.";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        
        Point bola=sj.getBola();                
        getMovimientoPortero(com,bola);
        getMovimientoDefensas(com,bola,sj);   
        getMovimientoAtaque(com,bola,sj);
      
        return com;
    }
    
    private int getPosicionY( int jugador, int cuadrante){
            int posY=0;
            int defensasDesplz=20;
            int contensionDesplz=30;
            int lateralesDesplz=18;
            int centralesDesplz=8;
            int cabezaAreaDesplz=10;
            switch (cuadrante){
                case 1: case 4: ///////////
                    switch (jugador){
                        case 1:case 2:case 3:case 4:case 7:
                            posY=nValores[jugador][1]-defensasDesplz;                            
                        break;
                        case 5:case 6:
                            posY=nValores[jugador][1]-contensionDesplz;                            
                        break;                        
                    }                    
                break;    
                case 2: case 5: ////////////////
                  switch (jugador){
                        case 1:
                           posY=nValores[jugador][1]+lateralesDesplz;                           
                        break;   
                        case 2:
                           posY=nValores[jugador][1]+centralesDesplz;                           
                        break;   
                        case 3:
                           posY=nValores[jugador][1]-centralesDesplz;                                                        
                        break;
                        case 4:
                            posY=nValores[jugador][1]-lateralesDesplz;                                                        
                        break;
                        case 5:
                            posY=nValores[jugador][1]+cabezaAreaDesplz;                            
                        break;                        
                        case 6:
                            posY=nValores[jugador][1]-cabezaAreaDesplz;                            
                        break;                        
                    }                            
                  break;    
                case 3: case 6://////////////////    
                    switch (jugador){
                        case 1:case 2:case 3:case 4:case 7:
                            posY=nValores[jugador][1]+defensasDesplz;                            
                        break;
                        case 5:case 6:
                            posY=nValores[jugador][1]+contensionDesplz;                            
                        break;                        
                    }                    
                break;                 
            }
       return posY;
    }
    
    private int getCuadranteDefensa(Point b){
        
        if(b.getX()< 0 && b.getY()< -50)  return 1;
        if(b.getX()< 0 && b.getY()<= 50)  return 2;
        if(b.getX()< 0 && b.getY()<= 120) return 3;
        if(b.getX()>= 0 && b.getY()< -50) return 4;   
        if(b.getX()>= 0 && b.getY()< 50)  return 5;
        if(b.getX()>= 0 && b.getY()< 120) return 6; 
        return -1;
    }
    
    private int getCuadranteAtaque(Point b){
        
        if(b.getX()< -80 && b.getY()< -50)  return 1;
        if(b.getX()< -80 && b.getY()<= 50)  return 2;
        if(b.getX()< -80 && b.getY()<= 120) return 3;
        if(b.getX()< 0 && b.getY()< -50)  return 4;
        if(b.getX()< 0 && b.getY()<= 50)  return 5;
        if(b.getX()< 0 && b.getY()<= 120) return 6;
        if(b.getX()>= 80 && b.getY()< -70) return 10;   
        if(b.getX()>= 80 && b.getY()< 70)  return 11;
        if(b.getX()>= 80 && b.getY()< 120) return 12; 
        if(b.getX()>= 0 && b.getY()< -50) return 7;   
        if(b.getX()>= 0 && b.getY()< 50)  return 8;
        if(b.getX()>= 0 && b.getY()< 120) return 9; 
        return -1;
    }
      
    
    public void getMovimientoAtaque(Vector<Comando> cmd,Point bola,SituacionJugadores sj){
         Vector<Comando> com=cmd;
         //Golpear bola
        Point jugadores[]=sj.getMisJugadores();
        int cuadrante=getCuadranteAtaque(bola);
        //Golpear bola
        for (int n=0;n<11;n++){
            
            if (cuadrante < 10){                
                int nSigJug=getSiguienteJugadorPorLinea(n,sj,jugadores);                                             
                com.add(new ComandoPase(n, nSigJug));
            }else{
                if(n==8 || n==10){
                    com.add(new ComandoPase(n,9));
                }
                com.add(new ComandoTiroAPuerta(n,0));
            }
        } 
         
    }
     public int getSiguienteJugadorPorLinea(int nJugador,SituacionJugadores sj,Point jugadores[]){
        int dev1[]=null;         
        if(nJugador==0){
          int nExc[]={nJugador};
           dev1=sj.getInfoMasCercano(jugadores,jugadores[nJugador],nExc,true);        
        }
        if(nJugador==1 || nJugador==2 || nJugador==3 || nJugador==4 ){
          int nExc[]={0,nJugador,1,2,3,4};  
          dev1=sj.getInfoMasCercano(jugadores,jugadores[nJugador],nExc,true);        
        }
        if(nJugador==5 || nJugador==6  ){
           int nExc[]={0,nJugador,1,2,3,4,5,6};  
           dev1=sj.getInfoMasCercano(jugadores,jugadores[nJugador],nExc,true);        
        }
        if(nJugador==7 ){
           int nExc[]={0,nJugador,1,2,3,4,5,6,9};
           dev1=sj.getInfoMasCercano(jugadores,jugadores[nJugador],nExc,true);        
        }
        if( nJugador==8 || nJugador==9  ||nJugador==10 ){
           int nExc[]={0,nJugador,1,2,3,4,5,6,7};
           dev1=sj.getInfoMasCercano(jugadores,jugadores[nJugador],nExc,false);        
        }
        //crear un arreglo por linea a partir de jugadores
        
        return dev1[0];
    }
    
    public void getMovimientoPortero(Vector<Comando> cmd,Point bola){
        Vector<Comando> com=cmd;
        int zonaDefensiva=-40;
        int y=(int)(bola.getY()/2);
        if (y<-20) y=-20;
        if (y>20) y=20;
        if (bola.getX() < zonaDefensiva )//si la bola esta un poco lejos ubicarlo mas adelante
            com.add(new ComandoIrA(0,nValores[0][0], y));
        else
            com.add(new ComandoIrA(0,nValores[0][0]+25, y));       
    }
    
     public void getMovimientoDefensas(Vector<Comando> cmd,Point bola,SituacionJugadores sj){
        Vector<Comando> com=cmd;
        int cuadrante=getCuadranteDefensa(bola); 
        int zonaDefensiva=-40;
        Point jugadores[]=sj.getMisJugadores();
        //movimientos defensa y contension
          for (int n=1;n<11;n++){
            int posY=getPosicionY(n,cuadrante);
            if ( n>7 ){
                posY=nValores[n][1];
            }    
            //Movimiento mas cercano a la bola
            int nJug=sj.getMasCercanoDeBola();        
            com.add(new ComandoIrA(nJug,bola.getX(), bola.getY())); 
            if(n != nJug){               
                if (bola.getX() > zonaDefensiva  ){//si la bola esta un poco lejos ubicarlo mas adelante
                    if(jugadores[n].getX()+30 > nValores[n][0]+30){                        
                        com.add(new ComandoIrA(n,nValores[n][0]+30,posY));
                    }else{    
                        com.add(new ComandoIrA(n,jugadores[n].getX()+30,posY));
                    }    
                }else{//si la resta es menor de la poscion original ubicarlos en original-10
                    if(jugadores[n].getX()-30 < nValores[n][0]-10){                        
                         com.add(new ComandoIrA(n,nValores[n][0]-10,posY));                     
                    }else{
                         com.add(new ComandoIrA(n,jugadores[n].getX()-30,posY));                     
                    }
                }
            } 
        }//end for
    }//end func
   
}
